package com.itheima.design.mode.strategy.controller;

import com.itheima.design.mode.strategy.entity.Order;
import com.itheima.design.mode.strategy.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {

    /**
     * version 1
     * 出现问题：营销活动有很多，这个switch会变得很庞大，不利于维护，并且很容易引入新的问题
     */
    @Autowired
    private OrderService orderService;

    /**
     * version 2
     * 把每个促销算法单独抽出一个方法，新加入一个促销活动只需要新增一个方法和case就可以了
     * 这里利用了设计原则的方法设计原则：单一职责原则
     * 但是这样写还会存在如下问题：
     * 营销活动经常变，这个switch就得经常改，还得不断加促销的算法方法…….
     * 改代码是bug的源泉，我们希望少改动OrderService！！！
     */
    @Autowired
    private OrderServiceV2 orderServiceV2;

    /**
     * version 3
     */
    @Autowired
    private OrderServiceV3 orderServiceV3;

    /**
     * version 4
     */
    @Autowired
    private OrderServiceV4 orderServiceV4;

    /**
     * version 5
     */
    @Autowired
    private OrderServiceV5 orderServiceV5;

    /**
     * 计算订单的促销金额
     *
     * @param order
     * @param promotion
     * @return
     */
    @RequestMapping("/prepareOrder")
    public Order prepareOrder(Order order, String promotion) {

        this.orderService.prepareOrder(order, promotion);

        this.orderServiceV2.prepareOrder(order, promotion);

        this.orderServiceV3.prepareOrder(order, promotion);

        this.orderServiceV4.prepareOrder(order, promotion);

        return this.orderServiceV5.prepareOrder(order, promotion);


    }
}
